﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using CRM.Database.Model.ExtendedClasses.Errors;

namespace CRM.Database.Model
{
    public class TurnoversCollection : AbstractCollection
    {
        /// <summary>
        /// Стстическая коллекция 
        /// </summary>
        protected static List<Turnovers> _list;

        /// <summary>
        /// Реальные обороты клиентов
        /// </summary>
        private static List<v_TrueTurnovers> _trueTurnovers;

        protected static List<v_TrueTurnovers> noviciesTurnovers;

        #region Overrides of AbstractCollection

        /// <summary>
        /// Получение типа текущего элемента
        /// </summary>
        /// <returns></returns>
        protected override Type GetItemType()
        {
            return typeof (Turnovers);
        }

        /// <summary>
        /// Обнуление статической коллекции
        /// </summary>
        protected override void SetStaticListToNULL()
        {
            _list = null;
        }


        /// <summary>
        /// Получение продаж клиента
        /// </summary>
        /// <param name="idlegaleentity">Ид юр. лица</param>
        /// <returns>Продажи</returns>
        public List<Turnovers> GetSalesByIdLegalEntity(int idlegaleentity)
        {
            return Entities.Turnovers.AsNoTracking().Where(c => c.IdDealerLegalEntity == idlegaleentity).ToList();
        }

        /// <summary>
        /// Получение статического списка для хранения объектов
        /// </summary>
        /// <returns></returns>
        public override object GetStaticCollection()
        {
            return _list;
        }

        /// <summary>
        /// Получение элемента из коллекции по идентификатору
        /// </summary>
        /// <param name="itemId">Идентификатор</param>
        /// <returns>Элемент</returns>
        public override object GetItemById(int itemId)
        {
            return Entities.Turnovers.Find(itemId);
        }


        /// <summary>
        /// Добавление коллекции оборотов
        /// </summary>
        /// <param name="collection">Коллекция оборотов</param>
        /// <param name="userLogin">Пользователь</param>
        /// <returns>Результат операции</returns>
        public bool AddTurnoversCollection(List<Turnovers> collection, string userLogin)
        {
            Entities.Configuration.AutoDetectChangesEnabled = false;

            foreach (Turnovers entity in collection)
            {
                SetChangedUser(entity, userLogin);
                Entities.Entry(entity).State = EntityState.Added;
            }

            Entities.Configuration.AutoDetectChangesEnabled = false;


            return Save();
        }

        /// <summary>
        /// Получение списка элементов
        /// </summary>
        /// <returns>Список элементов</returns>
        public override List<object> GetList()
        {
            return new List<object>(TurnoversList);
        }

        /// <summary>
        /// Обновление элемента в коллекции
        /// </summary>
        /// <param name="item">Новый элемент</param>
        /// <param name="userLogin">Логин пользователя, который делает изменения</param>
        /// <returns>Результат операции</returns>
        public bool Update(object item, string userLogin, bool save = true)
        {
            var newObject = (Turnovers) item;
            if (newObject == null)
                return false;


            var object4Update = GetItemByIdFromDatabase(newObject.GetKeyValue()) as Turnovers;
            if (object4Update == null)
                return false;

            if (newObject.Amount != null) object4Update.Amount = newObject.Amount;
            if (newObject.IdDealerLegalEntity != null)
                object4Update.IdDealerLegalEntity = newObject.IdDealerLegalEntity;
            if (newObject.IdLegalEntity != null) object4Update.IdLegalEntity = newObject.IdLegalEntity;
            if (newObject.IdProduct != null) object4Update.IdProduct = newObject.IdProduct;
            if (newObject.IdProductMark != null) object4Update.IdProductMark = newObject.IdProductMark;
            if (newObject.IdTurnoverClassification != null)
                object4Update.IdTurnoverClassification = newObject.IdTurnoverClassification;
            if (newObject.Period != null) object4Update.Period = newObject.Period;
            if (newObject.Quantity != null) object4Update.Quantity = newObject.Quantity;


            return base.Update(object4Update, userLogin, save);
        }

        #endregion

        /// <summary>
        /// Список оборотов
        /// </summary>
        public List<Turnovers> TurnoversList
        {
            get
            {
                return Entities.Turnovers.ToList();
                if (_list == null)
                    _list = DB.Entities.Turnovers.ToList();
                return _list;
            }
        }

        /// <summary>
        /// Реальные обороты клиентов
        /// </summary>
        public List<v_TrueTurnovers> TrueTurnovers
        {
            get
            {
                return DB.TrueTurnovers;
                ////    int page = 1000;
                ////    int skip = 0;
                ////    var result = new List<v_TrueTurnovers>();

                ////    for (int i = 1; i < 100; i++)
                ////    {
                ////        result.AddRange(Entities.v_TrueTurnovers.AsNoTracking().OrderBy(c=>c.IdTurnover).Skip(skip).Take(page).ToList());
                ////        skip = skip+page;
                ////        //page = page;
                ////    }


                ////    return result;
                //    if (_trueTurnovers == null)
                //    {
                //       // var col = new TurnoversCollection();
                //        try
                //        {
                //            _trueTurnovers = DB.Entities.v_TrueTurnovers.ToList();
                //        }
                //        catch
                //        {
                //        }

                //        //foreach (Turnovers turnover in col.GetTurnoversByIdTurnoverClassification(1))
                //        //{
                //        //    _trueTurnovers.Add(turnover);
                //        //}

                //        //foreach (Turnovers turnover in col.GetTurnoversByIdTurnoverClassification(2))
                //        //{
                //        //    _trueTurnovers.Add(turnover);
                //        //}

                //        //foreach (Turnovers turnover in col.GetTurnoversByIdTurnoverClassification(3))
                //        //{
                //        //    if (turnover.ClientSequentalNumber != 9119)
                //        //    {
                //        //        bool inDirectTurnoverOnSamePeriodExists = false;
                //        //        foreach (Turnovers indirectTurnover in turnover.LegalEntities.Customers.Sales)
                //        //        {
                //        //            if (indirectTurnover.Month == turnover.Month)
                //        //                if (indirectTurnover.Year == turnover.Year)
                //        //                {
                //        //                    inDirectTurnoverOnSamePeriodExists = true;
                //        //                    break;
                //        //                }
                //        //        }

                //        //        if (!inDirectTurnoverOnSamePeriodExists)
                //        //        {
                //        //            _trueTurnovers.Add(turnover);
                //        //        }
                //        //    }
                //        //}
                //    }

                //    return _trueTurnovers;

                //var      result = new List<TrueTurnover>();


                //       foreach(var customer in CustomersActive)
                //       {
                //           if (customer.SequentialNumber == 9008)
                //               break;

                //           if(customer.SequentialNumber==450)
                //           {

                //           }

                //           var indirect = customer.Sales;
                //           var production = customer.Turnovers.Where(p => p.IdTurnoverClassification == 2);
                //           var direct = customer.Turnovers.Where(p => p.IdTurnoverClassification == 3);

                //           foreach(var item in production)
                //           {

                //               //int iddealer = 0;
                //               //if (item.IdDealerLegalEntity != null)
                //               //{
                //               //     iddealer = (int) item.IdDealerLegalEntity;
                //               //}

                //               //int idle = 0;
                //               //if (item.IdLegalEntity != null)
                //               //{
                //               //    idle = (int)item.IdLegalEntity;
                //               //}

                //               //int idpr = 0;
                //               //if (item.IdProduct != null)
                //               //{
                //               //    idpr = (int)item.IdProduct;
                //               //}

                //               //int idtc = 0;
                //               //if (item.IdTurnoverClassification != null)
                //               //{
                //               //    idtc = (int)item.IdTurnoverClassification;
                //               //}

                //            //   result.Add(new TrueTurnover{Amount=item.Amount,IdDealerLegalEntity=iddealer,IdLegalEntity=idle,IdProduct=idpr,IdTurnoverClassification=idtc,Period=item.Period, IdTurnover=item.IdTurnover});
                //               if (item.IdTurnover == 117426)
                //               {

                //               }
                //               _trueTurnovers.Add(item);
                //           }

                //           foreach (var item in indirect)
                //           {

                //               int iddealer = 0;
                //               if (item.IdDealerLegalEntity != null)
                //               {
                //                   iddealer = (int)item.IdDealerLegalEntity;
                //               }

                //               int idle = 0;
                //               if (item.IdLegalEntity != null)
                //               {
                //                   idle = (int)item.IdLegalEntity;
                //               }

                //               int idpr = 0;
                //               if (item.IdProduct != null)
                //               {
                //                   idpr = (int)item.IdProduct;
                //               }

                //               int idtc = 0;
                //               if (item.IdTurnoverClassification != null)
                //               {
                //                   idtc = (int)item.IdTurnoverClassification;
                //               }

                //                if (item.IdTurnover == 117426)
                //               {

                //               }


                //               result.Add(new TrueTurnover { Amount = item.Amount, IdDealerLegalEntity = iddealer, IdLegalEntity = idle, IdProduct = idpr, IdTurnoverClassification = idtc, Period = item.Period, IdTurnover = item.IdTurnover });
                //               _trueTurnovers.Add(item);
                //           }

                //           foreach (var directItem in direct)
                //           {

                //               if (directItem.IdTurnover == 117426)
                //               {

                //               }


                //               bool exist = false;

                //               foreach (var indirectTurnover in result)
                //               {

                //                   if (indirectTurnover.IdTurnover == 117426)
                //                   {

                //                   }

                //                   if (indirectTurnover.Period.Month == directItem.Month && indirectTurnover.Period.Year == directItem.Period.Year)
                //                   {
                //                       exist = true;
                //                       break;
                //                   }
                //               }

                //              // if((indirect.Where(p=>p.Period.Month==item.Period.Month)).FirstOrDefault(c=>c.Period.Year==item.Period.Year)==null)
                //               if(!exist)
                //               { 
                //                   if(directItem.ClientSequentalNumber==450)
                //                   {

                //                   }
                //                   _trueTurnovers.Add(directItem);
                //                   //int iddealer = 0;
                //                   //if (item.IdDealerLegalEntity != null)
                //                   //{
                //                   //    iddealer = (int)item.IdDealerLegalEntity;
                //                   //}

                //                   //int idle = 0;
                //                   //if (item.IdLegalEntity != null)
                //                   //{
                //                   //    idle = (int)item.IdLegalEntity;
                //                   //}

                //                   //int idpr = 0;
                //                   //if (item.IdProduct != null)
                //                   //{
                //                   //    idpr = (int)item.IdProduct;
                //                   //}

                //                   //int idtc = 0;
                //                   //if (item.IdTurnoverClassification != null)
                //                   //{
                //                   //    idtc = (int)item.IdTurnoverClassification;
                //                   //}

                //                 //  result.Add(new TrueTurnover { Amount = item.Amount, IdDealerLegalEntity = iddealer, IdLegalEntity = idle, IdProduct = idpr, IdTurnoverClassification = idtc, Period = item.Period, IdTurnover = item.IdTurnover });

                //               }
                //           }
                //       }


                //       //foreach(var item in result)
                //       //{
                //       //    _trueTurnovers.Add(GetTurnoverbyId(item.IdTurnover));
                //       //}

                //   }

                //   return _trueTurnovers;

                //   //if (_trueTurnovers == null)
                //   //{
                //   //    var result = new List<Turnovers>();

                //   //    List<int> dialersIds=new List<int>();

                //   //    //foreach(var item in Turnovers)
                //   //    //{
                //   //    //    if(item.IdDealerLegalEntity != null && !dialersIds.Contains((int) item.IdDealerLegalEntity))
                //   //    //    {
                //   //    //        dialersIds.Add((int) item.IdDealerLegalEntity);
                //   //    //    }
                //   //    //}

                //   //    foreach (var item in Turnovers.Where(p => p.IdTurnoverClassification == 1))
                //   //        if (item.IdDealerLegalEntity != null && !dialersIds.Contains((int)item.IdDealerLegalEntity))
                //   //        {
                //   //            if (item.DealerLegalEntity != null) 
                //   //                dialersIds.Add(item.DealerLegalEntity.IdCustomer);
                //   //        }


                //   //    List<int> allDirectCustomers = new List<int>();

                //   //    foreach(var item in Turnovers.Where(p => p.IdTurnoverClassification == 3))
                //   //    {
                //   //       allDirectCustomers.Add(item.LegalEntities.IdCustomer);
                //   //    }

                //   //    List<int> directProduction = new List<int>();
                //   //    foreach(var item in allDirectCustomers)
                //   //    {
                //   //        if(!dialersIds.Contains(item))
                //   //        {
                //   //            directProduction.Add(item);
                //   //        }


                //   //    }

                //   //    directProduction.Add(GetCustomerBySequentalNumber(4307).IdCustomer);
                //   //    directProduction.Add(GetCustomerBySequentalNumber(422).IdCustomer);


                //   //    foreach(var turnover in Turnovers)
                //   //    {
                //   //        if(turnover.IdTurnoverClassification==1)
                //   //            result.Add(turnover);
                //   //        if(turnover.IdTurnoverClassification==2)
                //   //            result.Add(turnover);
                //   //        if(turnover.IdTurnoverClassification==4)
                //   //            result.Add(turnover);
                //   //        if(turnover.IdTurnoverClassification==3)
                //   //        {
                //   //            if(directProduction.Contains(turnover.LegalEntities.IdCustomer))
                //   //            {
                //   //                result.Add(turnover);
                //   //            }
                //   //        }
                //   //    }

                //   //    //foreach(var item in Turnovers)
                //   //    //{
                //   //    //    if(item.DealerLegalEntity != null && !dialersIds.Contains(item.DealerLegalEntity.IdCustomer))
                //   //    //    {
                //   //    //        result.Add(item);
                //   //    //    }
                //   //    //}

                //   //    _trueTurnovers = result;


                //   //    //    result = Turnovers.Where(p => p.IdTurnoverClassification == 3).ToList();


                //   //    //    _trueTurnovers=new List<Turnovers>();

                //   //    //    foreach (var item in result)
                //   //    //    {
                //   //    //        if (item.IdLegalEntity != null && !dialersIds.Contains((int) item.IdLegalEntity)) 
                //   //    //        {
                //   //    //            _trueTurnovers.Add(item);
                //   //    //        }
                //   //    //    }

                //   //    //  foreach(var item in Turnovers.Where(p => p.IdTurnoverClassification == 1).ToList())
                //   //    //  {
                //   //    //      _trueTurnovers.Add(item);
                //   //    //  }

                //   //    //  foreach (var item in Turnovers.Where(p => p.IdTurnoverClassification == 2).ToList())
                //   //    //  {
                //   //    //      _trueTurnovers.Add(item);
                //   //    //  }

                //   //    //  foreach (var item in Turnovers.Where(p => p.IdTurnoverClassification == 4).ToList())
                //   //    //  {
                //   //    //      _trueTurnovers.Add(item);
                //   //    //  }

                //   //}

                //   //return _trueTurnovers;

                //   //return Turnovers;
            }
        }

        /// <summary>
        /// Получение оборотов по идентификатору классификации
        /// </summary>
        /// <param name="turnoverClassificationId">Идентификатор классификациии оборотов</param>
        /// <returns>Список оборотов</returns>
        public List<Turnovers> GetTurnoversByIdTurnoverClassification(int turnoverClassificationId)
        {
            return TurnoversList.Where(c => c.IdTurnoverClassification == turnoverClassificationId).ToList();
        }


        /// <summary>
        /// Список оборотов новичков
        /// </summary>
        /// <returns></returns>
        public List<v_TrueTurnovers> GetNoviciesTurnovers()
        {
            if (noviciesTurnovers == null)
            {
                var col = new LegalEntitiesCollection();


                noviciesTurnovers = new List<v_TrueTurnovers>();

                foreach (LegalEntities le in col.LegalEntitiesList)
                {
                    v_TrueTurnovers turnover = le.FirstTrueTurnover;
                    if (turnover != null)
                        noviciesTurnovers.Add(turnover);
                }
            }

            return noviciesTurnovers;
        }

        #region Insert turnovers

        /// <summary>
        /// обработка таблицы с оборотами
        /// </summary>
        /// <param name="dataTable"></param>
        /// <param name="idTurnoverClassification"></param>
        /// <param name="idProductMark"></param>
        /// <returns></returns>
        public string InsertTurnovers(DataTable dataTable, int idTurnoverClassification, int idProductMark)
        {
            List<Turnovers> turnoversList;

            //обработка прямых оборотов продаж
            if (idTurnoverClassification == 3)
            {
                //поиск нужных столбцов в файле
                XlsFields columns = GetDirectColumnsNumbers(dataTable);
                if (columns == null)
                    return ErrorsCollection.GetErrorString(Errors.ColumnsError);

                turnoversList = GetDirectTurnoversListFromTable(dataTable, columns, idTurnoverClassification,
                                                                idProductMark);
                if (turnoversList.Count < 1)
                    return ErrorsCollection.GetErrorString(Errors.TurnoversCountZero);
            }

            throw new NotImplementedException();
        }

        #region General

        /// <summary>
        /// получить строку из объекта
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        private string GetStringFromCell(object obj)
        {
            return obj == null ? null : obj.ToString().Trim();
        }

        /// <summary>
        /// получить целое число из объекта или null
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        private int? GetIntFromCell(object obj)
        {
            if (obj == null) return null;
            string value = obj.ToString().Trim();
            int result;
            try
            {
                bool parseResult = int.TryParse(value, out result);
                if (!parseResult) return null;
            }
            catch
            {
                return null;
            }
            return result;
        }

        /// <summary>
        /// возвращает числовое значение из объекта
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        private float? GetFloatFromCell(object obj)
        {
            if (obj == null) return null;
            string value = obj.ToString().Trim();
            float result;
            try
            {
                value = value.Replace(".", ",");
                bool parseResult = float.TryParse(value, out result);
                if (!parseResult) return null;
            }
            catch
            {
                return null;
            }
            return result;
        }

        /// <summary>
        /// получить дату из объекта
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns>
        private DateTime? GetDateFromCell(object obj)
        {
            if (obj == null) return null;
            try
            {
                if (obj is double)
                    return DateTime.FromOADate(Convert.ToDouble(obj));
                if (obj is string)
                    return DateTime.Parse(obj.ToString().Trim());
            }
            catch
            {
                return null;
            }
            return null;
        }

        /// <summary>
        /// Класс для сопоставления номеров колонок
        /// </summary>
        protected class XlsFields
        {
            /// <summary>
            /// Плательщик
            /// </summary>
            public int NumberInSap { get; set; }

            /// <summary>
            /// Плательщик имя
            /// </summary>
            public int LegalEntityName { get; set; }

            /// <summary>
            /// БЕ
            /// </summary>
            public int Dealer { get; set; }

            /// <summary>
            /// Оборот
            /// </summary>
            public int Amount { get; set; }

            /// <summary>
            /// ДатФактуры
            /// </summary>
            public int Period { get; set; }

            /// <summary>
            /// Материал
            /// </summary>
            public int ProductInSap { get; set; }

            /// <summary>
            /// Последняя строка, до которой нужно анализировать файл
            /// </summary>
            public int EndString { get; set; }

            /// <summary>
            /// ФактурКолич(обрабатывается как оборот)
            /// </summary>
            public int Quantity { get; set; }

            /// <summary>
            /// столбец для поиска Юр лица для БИМАКС (5 тип оборота)
            /// </summary>
            public int LegalEntityForBimax { get; set; }

            /// <summary>
            /// номер строки с первым оборотом 
            /// </summary>
            public int FirstRow { get; set; }
        }

        #endregion

        #region Direct

        /// <summary>
        /// анализ таблицы с прямыми оботорами продаж
        /// </summary>
        /// <param name="dataTable"></param>
        /// <param name="columns"></param>
        /// <param name="idTurnoverClassification"></param>
        /// <param name="idProductMark"></param>
        /// <returns></returns>
        private List<Turnovers> GetDirectTurnoversListFromTable(DataTable dataTable, XlsFields columns,
                                                                int idTurnoverClassification, int idProductMark)
        {
            //коллекция Юр. Лиц. 
            var legalEntitiesCol = new LegalEntitiesCollection();

            //создание списка оборотов
            var result = new List<Turnovers>();

            List<string> allSapMatherialNumbers = GetAllSapMatherialNumbers();
            //var allSapLegalEntitiesNumbers = GetAllSapLegalEntitiesNumbers();
            //счетсчик строк
            int rowNumber = 1;

            //цикл по строкам таблицы
            foreach (DataRow row in dataTable.Rows)
            {
                if (++rowNumber < columns.FirstRow)
                    continue;
                if (rowNumber == columns.EndString)
                    return result;

                //создание нового оборота
                var turnover = new Turnovers
                                   {
                                       StringNumber = rowNumber,
                                       Miss = false,
                                       IdTurnoverClassification = idTurnoverClassification,
                                       IdProductMark = idProductMark
                                   };

                //счетчик ячеек
                int cellNumber = 0;

                //цикл по ячейкам строки
                foreach (DataColumn column in dataTable.Columns)
                {
                    cellNumber++;
                    object cell = row[column];

                    //обработка дилера - если дилер не найден - пропус этого оборота (не ошибка)
                    if (cellNumber == columns.Dealer)
                    {
                        string dealerStr = GetStringFromCell(cell);
                        if (dealerStr != null)
                            turnover.IdDealerLegalEntity = GetDaelerIdBySapNumber(dealerStr);
                        if (turnover.IdDealerLegalEntity == 0)
                        {
                            turnover.Miss = true;
                            break;
                        }
                    }

                    //Обработка номера SAP Юр Лица 
                    if (cellNumber == columns.NumberInSap)
                    {
                        int? sapNumber = GetIntFromCell(cell);
                        if (sapNumber == null)
                        {
                            turnover.Errors.Add(ErrorsCollection.GetErrorString(Errors.TurnoversSapNumberIsNotValid));
                            continue;
                        }
                        //если номер SAP попадает в исключения - не загружать этот оборот
                        if (!CheckSapNumberForExceptions((int) sapNumber))
                        {
                            turnover.Miss = true;
                            break;
                        }
                        //определение Юр Лица по номеру SAP
                        LegalEntities entity = legalEntitiesCol.GetLegalEntityBySapNumber((int) sapNumber);
                        if (entity == null)
                            turnover.Errors.Add(
                                ErrorsCollection.GetErrorString(Errors.TurnoversLegalEntityNotFoundBySapNumber) + " :" +
                                sapNumber);
                        if (entity != null)
                            if (entity.IdLegalEntity > 0)
                                turnover.IdLegalEntity = entity.IdLegalEntity;
                    }

                    //Обработка оборота
                    if (cellNumber == columns.Amount)
                    {
                        float? amount = GetFloatFromCell(cell);
                        if (amount == null)
                            turnover.Errors.Add(ErrorsCollection.GetErrorString(Errors.TurnoversAmountIsNotValid));
                        if (amount != null)
                        {
                            turnover.Amount = (float) amount;
                            //пропускаем, если нулевой оборот
                            if (amount == 0)
                                turnover.Miss = true;
                        }
                    }

                    //Обработка даты
                    if (cellNumber == columns.Period)
                    {
                        DateTime? date = GetDateFromCell(cell);
                        if (date == null)
                        {
                            turnover.Errors.Add(ErrorsCollection.GetErrorString(Errors.TurnoversDateIsNotValid));
                        }
                        else
                        {
                            turnover.Period = (DateTime) date;
                        }
                        if (turnover.Period > DateTime.Now)
                            turnover.Errors.Add(ErrorsCollection.GetErrorString(Errors.TurnoversPeriodHasFutureTime));
                    }
                } //конец цикла по ячейкам
            } //конец цикла по строкам


            return result;
        }

        /// <summary>
        /// получить id дилера по номеру дилера из САП
        /// </summary>
        /// <param name="dealerStr"></param>
        /// <returns></returns>
        private int GetDaelerIdBySapNumber(string dealerStr)
        {
            //"профайн РУС"
            if (dealerStr == "80")
                return 51;
            //"профайн Германия"
            if (dealerStr == "10")
                return 52;
            return 0;
        }

        /// <summary>
        /// Заполняет класс XlsFields номерами толбцов файла с прямыми оборотами
        /// </summary>
        /// <param name="dataTable"></param>
        /// <returns></returns>
        private XlsFields GetDirectColumnsNumbers(DataTable dataTable)
        {
            var result = new XlsFields();

            int ceellNumber = 1;
            int headerRow = 8;

            result.FirstRow = headerRow + 2;

            foreach (DataColumn column in dataTable.Columns)
            {
                object obj = dataTable.Rows[headerRow][column];
                if (obj != null)
                {
                    string cell = obj.ToString();
                    string cellRes = cell.Trim().ToUpper();
                    switch (cellRes)
                    {
                            //Номер столбца номера клиента SAP
                        case "ПЛАТЕЛЬЩИК":
                            {
                                result.NumberInSap = ceellNumber;
                                break;
                            }
                            //Номер столбца Юр Лица
                        case "ПЛАТЕЛЬЩИК ИМЯ":
                            {
                                result.LegalEntityName = ceellNumber;
                                break;
                            }
                            //Номер столбца периода
                        case "ДАТФАКТУРЫ":
                            {
                                result.Period = ceellNumber;
                                break;
                            }

                            //Номер столбца дилера
                        case "БЕ":
                            {
                                result.Dealer = ceellNumber;
                                break;
                            }

                            //Номер столбца номера клиента SAP
                        case "ОБРВЛВНКРС":
                            {
                                result.Amount = ceellNumber;
                                break;
                            }

                            //Номер столбца номера материала в SAP
                        case "МАТЕРИАЛ":
                            {
                                result.ProductInSap = ceellNumber;
                                break;
                            }

                            //ФактурКолич
                        case "ФАКТУРКОЛИЧ":
                            {
                                result.Quantity = ceellNumber;
                                break;
                            }

                            //Юр лицо для БИМАКС
                        case "№ ЗАКАЗА НА ПОСТАВКУ":
                            {
                                result.LegalEntityForBimax = ceellNumber;
                                break;
                            }
                    }
                    ceellNumber++;
                }
            }

            headerRow = 1;
            foreach (DataRow row in dataTable.Rows)
            {
                headerRow++;
                foreach (DataColumn column in dataTable.Columns)
                {
                    string endString = row[column].ToString();
                    if (endString.Trim() == "*")
                    {
                        result.EndString = headerRow - 2;
                        break;
                    }
                }
            }
            if (result.Amount > 0 &&
                result.Dealer > 0 &&
                result.NumberInSap > 0 &&
                result.Period > 0 &&
                result.ProductInSap > 0 &&
                result.Quantity > 0 &&
                result.EndString > 0)
            {
                return result;
            }
            return null;
        }

        /// <summary>
        /// Возвращает список всех SAP номеров клиентов 
        /// </summary>
        /// <returns></returns>
        private List<int> GetAllSapLegalEntitiesNumbers()
        {
            var col = new LegalEntitiesCollection();
            var result = new List<int>();
            foreach (LegalEntities legalEntity in col.LegalEntitiesList)
            {
                if (legalEntity.NumberInSAP > 0)
                    if (legalEntity.NumberInSAP != null) result.Add((int) legalEntity.NumberInSAP);
            }
            return result;
        }

        /// <summary>
        /// Возвращает список всех SAP номеров материала
        /// </summary>
        /// <returns></returns>
        private List<string> GetAllSapMatherialNumbers()
        {
            var col = new ProductsCollection();
            var result = new List<string>();
            foreach (Products product in col.ProductsList)
            {
                result.Add(product.SAPMaterialNumber);
            }
            return result;
        }

        /// <summary>
        /// проверяет совпадение номеров с теми, обороты которых загружать не нужно. 
        /// </summary>
        /// <param name="number"></param>
        /// <returns></returns>
        private bool CheckSapNumberForExceptions(int number)
        {
            const int ex1 = 204000080;
            return number != ex1;
        }

        #endregion

        #endregion
    }
}